#ifndef __DRV_SPI_H__
#define __DRV_SPI_H__

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"

#define     __CC1101_TX_TEST__                            //如果测试发送功能则需要定义该宏，如果测试接收则需要屏蔽该宏
//#define     __USE_SOFT_SPI_INTERFACE__                    //如果使用软件SPI则需要定义该宏，反之如果使用硬件SPI则需要屏蔽该宏

//SPI引脚定义
//STM32103C8T6中的SPI1，重映射到NSS->PA15 SCK->PB3 MISO->PB4 MOSI->PB5
#define SPI_CLK_GPIO_PORT               GPIOB
#define SPI_CLK_GPIO_CLK                RCC_APB2Periph_GPIOB
#define SPI_CLK_GPIO_PIN                GPIO_Pin_3

#define SPI_MISO_GPIO_PORT              GPIOB
#define SPI_MISO_GPIO_CLK               RCC_APB2Periph_GPIOB
#define SPI_MISO_GPIO_PIN               GPIO_Pin_4

#define SPI_MOSI_GPIO_PORT              GPIOB
#define SPI_MOSI_GPIO_CLK               RCC_APB2Periph_GPIOB
#define SPI_MOSI_GPIO_PIN               GPIO_Pin_5

#define SPI_NSS_GPIO_PORT               GPIOA
#define SPI_NSS_GPIO_CLK                RCC_APB2Periph_GPIOA
#define SPI_NSS_GPIO_PIN                GPIO_Pin_15

#define spi_set_nss_high( )             SPI_NSS_GPIO_PORT->ODR |= SPI_NSS_GPIO_PIN                                  //片选置高
#define spi_set_nss_low( )              SPI_NSS_GPIO_PORT->ODR &= (uint32_t)( ~((uint32_t)SPI_NSS_GPIO_PIN ))       //片选置低

#ifdef __USE_SOFT_SPI_INTERFACE__       /** 只有使用软件SPI才需要的封装 */            
#define spi_set_clk_high( )             SPI_CLK_GPIO_PORT->ODR |= SPI_CLK_GPIO_PIN                                  //时钟置高
#define spi_set_clk_low( )              SPI_CLK_GPIO_PORT->ODR &= (uint32_t)( ~((uint32_t)SPI_CLK_GPIO_PIN ))       //时钟置低
#define spi_set_mosi_hight( )           SPI_MOSI_GPIO_PORT->ODR |= SPI_MOSI_GPIO_PIN                                //发送脚置高
#define spi_set_mosi_low( )             SPI_MOSI_GPIO_PORT->ODR &= (uint32_t)( ~((uint32_t)SPI_MOSI_GPIO_PIN ))     //发送脚置低
#define spi_get_miso( )                 (( SPI_MISO_GPIO_PORT->IDR & (uint32_t)SPI_MISO_GPIO_PIN) != SPI_MISO_GPIO_PIN ) ? 0 : 1 // 若相应输入位为低则得到0，相应输入位为高则得到1

#else                                   /** 只有使用硬件SPI时会使用 */
#define SPI_PORT                        SPI1                            //SPI接口
#define SPI_PORT_CLK                    RCC_APB2Periph_SPI1             //SPI时钟
#endif

void drv_spi_init( void );
uint8_t drv_spi_read_write_byte( uint8_t TxByte );
#endif

